#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Key.h"
/**
  * 函    数：按键初始化
  * 参    数：无
  * 返 回 值：无
  */
void Key_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		//开启GPIOA的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;

#if _OPEN_WK_UP_CONFIG
	/* 配置 WK_UP、KEY0 引脚： WK_UP_GPIO_PIN  为下拉输入模式*/

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;    //设置成下拉输入
	GPIO_InitStructure.GPIO_Pin = WK_UP_GPIO_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(WK_UP_GPIO_PROT, &GPIO_InitStructure);				
	
#endif
	
#if _OPEN_KEY1_CONFIG
	/* 配置 KEY1 引脚： KEY1_GPIO_PIN  为上拉输入模式*/

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //设置成上拉输入
	GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(KEY1_GPIO_PROT, &GPIO_InitStructure);				
	
#endif

#if _OPEN_KEY2_CONFIG
	/* 配置 KEY2 引脚： KEY2_GPIO_PIN  为上拉输入模式*/

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //设置成上拉输入
	GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(KEY2_GPIO_PROT, &GPIO_InitStructure);				
	
#endif

#if _OPEN_KEY3_CONFIG
	/* 配置 KEY3 引脚： KEY3_GPIO_PIN  为上拉输入模式*/

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //设置成上拉输入
	GPIO_InitStructure.GPIO_Pin = KEY3_GPIO_PIN ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(KEY3_GPIO_PROT, &GPIO_InitStructure);				
	
#endif

}



/**
  * 函    数：按键获取键码
  * 参    数：无
  * 返 回 值：按下按键的键码值，范围：0~2，返回0代表没有按键按下
  * 注意事项：此函数是阻塞式操作，当按键按住不放时，函数会卡住，直到按键松手
  */
uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;		//定义变量，默认键码值为0
	
	if (GPIO_ReadInputDataBit(WK_UP_GPIO_PROT, WK_UP_GPIO_PIN) == 1)			//读 WK_UP_GPIO_PIN 输入寄存器的状态，如果为1，则代表按键1按下
	{
		Delay_ms(20);											//延时消抖
		while (GPIO_ReadInputDataBit(WK_UP_GPIO_PROT, WK_UP_GPIO_PIN) == 1);	//等待按键松手
		Delay_ms(20);											//延时消抖
		KeyNum = 1;												//置键码为1
	}
	
	if (GPIO_ReadInputDataBit(KEY1_GPIO_PROT, KEY1_GPIO_PIN) == 0)			//读 KEY1_GPIO_PIN 输入寄存器的状态，如果为0，则代表按键2按下
	{
		Delay_ms(20);											//延时消抖
		while (GPIO_ReadInputDataBit(KEY1_GPIO_PROT, KEY1_GPIO_PIN) == 0);	//等待按键松手
		Delay_ms(20);											//延时消抖
		KeyNum = 2;												//置键码为2
	}
	
	if (GPIO_ReadInputDataBit(KEY2_GPIO_PROT, KEY2_GPIO_PIN) == 0)			//读 KEY2_GPIO_PIN 输入寄存器的状态，如果为0，则代表按键2按下
	{
		Delay_ms(20);											//延时消抖
		while (GPIO_ReadInputDataBit(KEY2_GPIO_PROT, KEY2_GPIO_PIN) == 0);	//等待按键松手
		Delay_ms(20);											//延时消抖
		KeyNum = 3;												//置键码为3
	}

	if (GPIO_ReadInputDataBit(KEY3_GPIO_PROT, KEY3_GPIO_PIN) == 0)			//读 KEY3_GPIO_PIN 输入寄存器的状态，如果为0，则代表按键2按下
	{
		Delay_ms(20);											//延时消抖
		while (GPIO_ReadInputDataBit(KEY3_GPIO_PROT, KEY3_GPIO_PIN) == 0);	//等待按键松手
		Delay_ms(20);											//延时消抖
		KeyNum = 4;												//置键码为4
	}
	
	return KeyNum;			//返回键码值，如果没有按键按下，所有if都不成立，则键码为默认值0
}

//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0，没有任何按键按下
//1，KEY0按下
//2，KEY1按下
//3，KEY3按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY_UP!!
u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(KEY3==0||KEY2==0||KEY1==0||WK_UP==1))
	{
		Delay_ms(10);//去抖动 
		key_up=0;
		if(KEY3==0)return 4;
		else if(KEY2==0)return 3;
		else if(KEY1==0)return 2;
		else if(WK_UP==1)return 1;
	}else if(KEY3==1&&KEY2==1&&KEY1==1&&WK_UP==0)key_up=1; 	    
 	return 0;// 无按键按下
}





